//
//  ExtensionProcotol.swift
//  DemoProject
//
//  Created by Hao on 2018/8/23.
//  Copyright © 2018年 hao. All rights reserved.
//

/// 以下这种方式确保所有扩展都以 obj.extend.func() 形式调用

import UIKit

extension String : ExtensionProcotol { }

/// Extend NSObject with `rx` proxy.
extension NSObject : ExtensionProcotol { }

// MARK: Extension Procotol
struct ExtensionStruct<T> {
    public let type: T
    public init(_ type: T) { self.type = type }
}

protocol ExtensionProcotol {
    /// Extended type
    associatedtype CompatibleType
    
    /// Reactive extensions.
    var extend: ExtensionStruct<CompatibleType> { get set }
}

extension ExtensionProcotol {
    /// Reactive extensions.
    var extend: ExtensionStruct<Self> {
        get {
            return ExtensionStruct(self)
        }
        set {
            // this enables using Reactive to "mutate" base object
        }
    }
}

/// 对 String 扩展
extension ExtensionStruct where T == String {
    
    func getTestString() -> String {
        return "getTestString"
    }
    
}

/// where 后面紧跟的是条件 T : NSString(或T == String) 表示 泛型 T 必须是 NSString(class类型) 的子类 或者 T == String(struct类型)
/// class类型使用  :
/// struct类型使用 ==
/// T 为 ExtensionStruct 的泛型
extension ExtensionStruct where T : UIView {
    
    var test: String {
        return self.type.description
    }
    
}

class TCV: BaseViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
//        let btn = UIButton()
//        btn.extend.test
//        "".extend.getTestString()
//        UIView().add()
    }
}


